package net.NingXiaRuiTai.ShortChain.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import net.NingXiaRuiTai.ShortChain.model.LoginUser;

import java.util.Date;
@Slf4j
public class JwtUtil {
    /*
    * 主题
    * */
    private static final String SUBJECT="ningxia";
    /*
    * 加密密钥
    * */
    private static final String SECRET="TaoliRuiTai";

    /*
    * 令牌有效期，7天
    * */
    private static final int EXPIRE=1000*60*60*24*7;
    /*
    * 令牌前缀
    * */
    private static final String TOKEN_PREFIX="dcloud";





    /**
     * 生成token
     * @param loginUser
     * @return
     */
    public static String genJsonWebToken(LoginUser loginUser){
        if(loginUser==null){
            throw new NullPointerException("对象是空");
        }
        String token = Jwts.builder().setSubject(SUBJECT)
                //配置payload
                .claim("head_img", loginUser.getHeadImg())
                .claim("accountNo", loginUser.getAccountNo())
                .claim("username", loginUser.getUsername())
                .claim("phone", loginUser.getPhone())
                .claim("mail", loginUser.getMail())
                .claim("auth", loginUser.getAuth())
                //配置签发时间
                .setIssuedAt(new Date())
                //配置过期时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                //配置签名
                .signWith(SignatureAlgorithm.HS256, SECRET).compact();
                    token = TOKEN_PREFIX + token;
        return token;
    }


    public static Claims checkJWT(String token){
        log.info("开始解析token:{}",token);

        try {
            //parseClaimsJws(token.replace(TOKEN_PREFIX, "")):
            // 解析 JWT。token.replace(TOKEN_PREFIX, "") 是将 JWT 中的前缀（例如 "Bearer "）去除，
            // 只保留实际的 JWT 内容。getBody(): 获取 JWT 中的声明（claims）
            final Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody();
            log.info("token解析完毕");
            return claims;
        }catch (Exception e){
           log.error("token校验失败");
           return null;
        }
    }
}
